/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package com.ejb.controlador.restservice;

import com.ejb.negocio.JuegosFacade;
import com.ejb.persistencia.Binjuego;
import com.ejb.persistencia.Juegos;
import com.ejb.persistencia.Xmljuego;
import com.sun.org.apache.xerces.internal.impl.dv.util.Base64;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.StringWriter;
import java.io.UnsupportedEncodingException;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.ejb.EJB;
import javax.imageio.ImageIO;
import javax.json.Json;
import javax.json.JsonArray;
import javax.json.JsonArrayBuilder;
import javax.json.JsonWriter;
import javax.json.stream.JsonGenerator;

/**
 *
 * @author MoisesAntonio
 */
public class RestController {
    
    @EJB
    JuegosFacade ejbFacade;
    
    private List<Juegos> juegos;
    
    public RestController() { }
    
    public String ultimosJuegos(){
        
        juegos=ejbFacade.ultimosJuegos();
        
        StringWriter swriter = new StringWriter();
        JsonArrayBuilder value = Json.createArrayBuilder();
        for (Juegos juego : juegos) {
            value.add(Json.createObjectBuilder()
                    .add("id", juego.getIdJuego())
                    .add("nombre", juego.getNombreJuego())
                    .add("edad", juego.getEdad())
                    .add("tipo", juego.getTipo())
                    .build()
            );
        }
        
        JsonArray arr = value.build();
        
        JsonWriter writer = Json.createWriter(swriter);
        writer.writeArray(arr);
        writer.close();
        
        return swriter.toString();
    }
    
    public String juegosBuscados(String nombre){
        juegos=ejbFacade.buscar(nombre);
        
        StringWriter swriter = new StringWriter();
        JsonArrayBuilder value = Json.createArrayBuilder();
        for (Juegos juego : juegos) {
            value.add(Json.createObjectBuilder()
                    .add("id", juego.getIdJuego())
                    .add("nombre", juego.getNombreJuego())
                    .add("edad", juego.getEdad())
                    .add("tipo", juego.getTipo())
                    .build()
            );
        }
        
        JsonArray arr = value.build();
        
        JsonWriter writer = Json.createWriter(swriter);
        writer.writeArray(arr);
        writer.close();
        
        return swriter.toString();
    }
    
    public String todosLosJuegos(int i){
        juegos=ejbFacade.juegosPublicados();
        
        StringWriter swriter = new StringWriter();
        JsonArrayBuilder value = Json.createArrayBuilder();
        for (Juegos juego : juegos) {
            if(juego.getPublicado()){
                value.add(Json.createObjectBuilder()
                    .add("id", juego.getIdJuego())
                    .add("nombre", juego.getNombreJuego())
                    .add("edad", juego.getEdad())
                    .add("tipo", juego.getTipo())
                    .build()
                );
            }
        }
        
        JsonArray arr = value.build();
        
        JsonWriter writer = Json.createWriter(swriter);
        writer.writeArray(arr);
        writer.close();
        
        return swriter.toString();
    }
    
    public String descargarJuego(int i){
        Juegos juego=ejbFacade.find(i);
        List<Xmljuego> xml=juego.getXmljuegoList();
        List<Binjuego> binarios=juego.getBinjuegoList();
        
        StringWriter swriter = new StringWriter();
        
        JsonArrayBuilder value = Json.createArrayBuilder();
        for (Binjuego bin : binarios) {
            value.add(Json.createObjectBuilder()
                .add("id", bin.getBinjuegoPK().getIdBin())
                .add("tipo", bin.getTipo())
                .add("bin", crearImagen(bin.getBindata()))
                .build()
            );
        }
        
        JsonArray arrBin = value.build();
        
        try (JsonGenerator jsonGen = Json.createGenerator(swriter)) {
            jsonGen.writeStartObject()
                .write("id", juego.getIdJuego())
                .write("nombre", juego.getNombreJuego())
                .write("edad", juego.getEdad())
                .write("tipo", juego.getTipo())
                .write("xmlinfo", crearXml(xml.get(0).getInfo()))
                .write("juego", crearXml(xml.get(0).getJuego()))
                .write("escenarios", arrBin)
            .writeEnd();
        }
        
        return swriter.toString();
    }
    
    private String crearXml(byte[] data){
        try {
            return new String(data, "UTF-8");
        } catch (UnsupportedEncodingException ex) {
            Logger.getLogger(RestController.class.getName()).log(Level.SEVERE, null, ex);
        }
        return null;
    }
    
    private String crearImagen(byte[] data){
        String encodedImage="";
        try {
            InputStream fis = new ByteArrayInputStream(data);
            Image image = ImageIO.read(fis);
            
            // Creamos un buffer image.
            BufferedImage bimage = new BufferedImage(image.getWidth(null), image.getHeight(null), BufferedImage.TYPE_INT_ARGB);

            // Pasamos la imágen al Buffer.
            Graphics2D bGr = bimage.createGraphics();
            bGr.drawImage(image, 0, 0, null);
            bGr.dispose();
			    
            //Y del buffer al array.
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            ImageIO.write( bimage, "png", baos );
            baos.flush();
            byte[] imageInByte = baos.toByteArray();
            baos.close();
            
            //Esto se queda como está que es como codificar la imagen.
            encodedImage = Base64.encode(imageInByte);
            
            
        } catch (IOException ex) {
            Logger.getLogger(RestController.class.getName()).log(Level.SEVERE, null, ex);
        }
        return encodedImage;
    }
}
